package com.ittao.taoaicodemother.service;

import com.ittao.taoaicodemother.exception.BusinessException;
import com.ittao.taoaicodemother.model.dto.app.AppAddRequest;
import com.ittao.taoaicodemother.model.dto.app.AppQueryRequest;
import com.ittao.taoaicodemother.model.entity.App;
import com.ittao.taoaicodemother.model.entity.User;
import com.ittao.taoaicodemother.model.vo.app.AppVO;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * 应用 服务层。
 *
 * @author <a href="https://gitee.com/it-heima-ht">程序员 Tao</a>
 */
public interface AppService extends IService<App> {

    /**
     * 与 AI 聊天，生成代码
     * @param appId 应用 ID
     * @param message 提示词
     * @param loginUser 登录用户
     * @return
     */
    Flux<String> chatToGenCode(Long appId, String message, User loginUser);

    /**
     * 创建应用
     * @param appAddRequest 应用添加请求
     * @param loginUser 登录用户
     * @return 应用 ID
     */
    Long addApp(AppAddRequest appAddRequest, User loginUser);

    /**
     * 部署应用
     * @param appId 应用 ID
     * @param loginUser 登录用户
     * @return 可访问的部署地址
     */
    String deployApp(Long appId, User loginUser);

    /**
     * 异步生成应用截图
     *
     * @param appId  应用ID
     * @param appUrl 应用访问URL
     */
    void generateAppScreenshotAsync(Long appId, String appUrl);

    /**
     * 获取脱敏的应用信息
     *
     * @param app 应用
     * @return 脱敏后的应用信息
     */
    AppVO getAppVO(App app);

    /**
     * 获取应用信息列表
     *
     * @param appList 应用列表
     * @return 脱敏后的应用信息列表
     */
    List<AppVO> getAppVOList(List<App> appList);

    /**
     * 构建查询条件
     *
     * @param appQueryRequest 应用查询请求
     * @return 查询条件
     */
    QueryWrapper getQueryWrapper(AppQueryRequest appQueryRequest);

    /**
     * 使用AI生成应用名称
     *
     * @param initPrompt 用户的初始描述
     * @return 生成的应用名称
     */
    String generateAppName(String initPrompt);

    /**
     * 删除应用及其关联的文件和数据
     *
     * @param appId 应用ID
     * @return 是否删除成功
     */
    boolean deleteAppWithCleanup(Long appId);

    /**
     * 中断AI生成任务
     * @param appId 应用ID
     * @param taskId 任务ID
     * @param loginUser 登录用户
     * @return 是否成功中断
     */
    boolean interruptGeneration(Long appId, String taskId, User loginUser);

    /**
     * 下线应用（取消部署）
     * @param appId 应用ID
     * @param loginUser 登录用户
     * @return 是否成功下线
     */
    boolean undeployApp(Long appId, User loginUser);

    /**
     * 获取应用生成状态
     * @param appId 应用ID
     * @param loginUser 登录用户
     * @return 生成状态信息
     */
    String getGenerationStatus(Long appId, User loginUser);

    /**
     * 准备应用代码下载
     *
     * @param app 应用信息
     * @return 本地代码目录路径
     * @throws BusinessException 业务异常
     */
    String prepareAppCodeForDownload(App app);
}
